﻿using System;
using System.Collections.Generic;
using System.Text;
using RC.ControlAcceso.BaseDatos;
using RC.ControlAcceso.BaseDatos.GestionHorariaTableAdapters;

namespace RC.ControlAcceso.ObjetosNegocio
{
    /// <summary>
    /// Clase de presentación
    /// </summary>
    public partial class CA2Tarjeta
    {
        /// <summary>
        /// Devuelve la conversión del estado de la tarjeta a string.
        /// </summary>
        public string EstadoString
        {
            get
            {
                return CA2Parametros.TarjetaEstadoString(Estado);
            }
        }
    }

    public partial class CA2Tarjeta
    {
        #region Atributos
        protected int _numero;
        protected int _estado;
        protected string _descripcion;
        protected int _tipo;
        protected bool _ImprimirTicket;
        #endregion

        #region Propiedades
        public int Numero
        {
            get
            {
                return _numero;
            }
            set
            {
                _numero = value;
            }
        }
        public int Estado
        {
            get
            {
                return _estado;
            }
            set
            {
                _estado = value;
            }
        }
        public string Descripcion
        {
            get
            {
                return _descripcion;
            }
            set
            {
                _descripcion = value;
            }
        }
        public int Tipo
        {
            get
            {
                return _tipo;
            }
            set
            {
                _tipo = value;
            }
        }
        public bool ImprimirTicket
        {
            get
            {
                return _ImprimirTicket;
            }
            set
            {
                _ImprimirTicket = value;
            }
        }
        
        //Propiedades derivadas
        
        #endregion

        #region Interfase DAL
        //objeto de la capa DAL
        private CATarjetaTableAdapter _tarjetaAD;
        protected CATarjetaTableAdapter Adaptador
        {
            get
            {
                if (_tarjetaAD == null)
                    _tarjetaAD = new CATarjetaTableAdapter();

                return _tarjetaAD;
            }
        }
        protected static CA2Tarjeta ObtenerPorID(int pIDNumeroTarjeta)
        {
            CA2Tarjeta _tarjeta = null ;

            GestionHoraria.CATarjetaDataTable _dt;

            // obtengo el elemento por ID
            CATarjetaTableAdapter _adaptador = new CATarjetaTableAdapter(); // lo creo aca por que este es un metodo estatico
            _dt = _adaptador.ObtenerPorID(pIDNumeroTarjeta);

            // si tiene algo,
            if (_dt.Rows.Count > 0)
                _tarjeta = AsignarRowAObjeto((GestionHoraria.CATarjetaRow)_dt.Rows[0]);
            
            return _tarjeta;
        }
        protected static CA2Tarjeta AsignarRowAObjeto(GestionHoraria.CATarjetaRow pRow)
        {
            CA2Tarjeta _tarjeta = null;
            if (pRow != null)
            {
                _tarjeta = new CA2Tarjeta();
                _tarjeta.Numero = pRow.Numero;
                try { _tarjeta.Estado = pRow.Estado; }
                catch { _tarjeta.Estado = 0; }
                try { _tarjeta.Descripcion = pRow.Descripcion; }
                catch { _tarjeta.Descripcion = ""; }
                try { _tarjeta.Tipo = pRow.Tipo; }
                catch { _tarjeta.Tipo = 1; }
                _tarjeta.ImprimirTicket = pRow.ImprimirTicket;
            }
            return _tarjeta;
        }
        protected CA2Tarjeta InsertarDAL(int pNumero, int pEstado, string pDescripcion, int pTipo, bool pImprimirTicket)
        {
            Numero = int.Parse(Adaptador.Insertar(pNumero, pEstado, pDescripcion, pTipo, pImprimirTicket).ToString());
            return this;
        }
        protected bool ActualizarDAL(int pNumero, int pEstado, string pDescripcion, int pTipo, bool pImprimirTicket)
        {
            if (pNumero == 0)
                return false;

            if (0 < Adaptador.Actualizar(pNumero, pEstado, pDescripcion, pTipo, pImprimirTicket))
                return true;
            else
                return false;
        }
        public static CA2TarjetaColeccion ObtenerPorEstado(int pEstado)
        {
            GestionHoraria.CATarjetaDataTable _dt;

            CATarjetaTableAdapter _adaptador = new CATarjetaTableAdapter(); // lo creo aca por que este es un metodo estatico
            _dt = _adaptador.ObtenerPorEstado(pEstado);

            return AsignarTarjetaTableAdapterATarjetaColeccion(_dt);

        }
        public static CA2TarjetaColeccion ObtenerTodas()
        {
            GestionHoraria.CATarjetaDataTable _dt;

            CATarjetaTableAdapter _adaptador = new CATarjetaTableAdapter(); // lo creo aca por que este es un metodo estatico
            _dt = _adaptador.ObtenerTodoss();

            return AsignarTarjetaTableAdapterATarjetaColeccion(_dt);

        }
        protected static CA2TarjetaColeccion AsignarTarjetaTableAdapterATarjetaColeccion(GestionHoraria.CATarjetaDataTable pDataTable)
        {
            CA2TarjetaColeccion _tarjetas = new CA2TarjetaColeccion();
            CA2Tarjeta _tarjeta;

            if ((pDataTable != null)
                && (pDataTable.Rows.Count > 0))
            {
                foreach (GestionHoraria.CATarjetaRow _row in pDataTable.Rows)
                {
                    _tarjeta = AsignarRowAObjeto(_row);
                    if (_tarjeta != null)
                        _tarjetas.Add(_tarjeta);
                }
            }
            return _tarjetas;
        }
        public CA2TarjetaColeccion ObtenerTarjetasDisponibles()
        {
            return AsignarTarjetaTableAdapterATarjetaColeccion(Adaptador.ObtenerTarjetasDisponibles());
        }
        
        #endregion

        #region Métodos
        public CA2Tarjeta()
        {
            AsignarValoresIniciales();
        }        

        public void AsignarValoresIniciales()
        {
            this.Descripcion = "";
            this.Estado = 0;
            this.Numero = -1;
            this.Tipo = 1;
            this.ImprimirTicket = true;
        }

        public static CA2Tarjeta CrearTarjeta()
        {
            CA2Tarjeta _tarjeta = new CA2Tarjeta();
            return _tarjeta;
        }

        /// <summary>
        /// El id de la tarjeta es el mismo que el numero de tarjeta(es el mismo campo)
        /// </summary>
        /// <param name="pID"></param>
        /// <returns></returns>
        public static CA2Tarjeta CrearTarjeta(int pID)
        {
            CA2Tarjeta _tarjeta = ObtenerPorID(pID);
            return _tarjeta;
        }
        public CA2Tarjeta Insertar()
        {
            ValidarTarjetaParaInsertar(Numero);
            return InsertarDAL(Numero, Estado, Descripcion, Tipo, ImprimirTicket);
        }
        public bool Actualizar()
        {
            return ActualizarDAL(Numero, Estado, Descripcion, Tipo, ImprimirTicket);
        }
        public void Eliminar()
        {
            if (this.Numero > 0)
            {
                CA2Tarjeta _tarjeta = CA2Tarjeta.CrearTarjeta(this.Numero);                
                _tarjeta.Eliminar();
            }            
        }
        #endregion

        #region Metodos para datasource
        public void Actualizar(CA2Tarjeta pTarjeta)
        {
            if (pTarjeta != null)
                pTarjeta.Actualizar();
        }
        public CA2Tarjeta Insertar(CA2Tarjeta pTarjeta)
        {
            if (pTarjeta != null)
                return pTarjeta.Insertar();
            return null;
        }
        public void Eliminar(CA2Tarjeta pTarjeta)
        {
            pTarjeta.Eliminar();
            pTarjeta = null;
        }
        
        #endregion

        private enum ValidarPara
        {
            Nueva,
            Actualizar
        }
        private bool ValidarTarjetaParaInsertar(int pNumero)
        {
            //Verifico que la tarjeta no exista.
            CA2Tarjeta _tarjeta = CA2Tarjeta.CrearTarjeta(pNumero);
            if (_tarjeta != null)
            {
                throw new ArgumentException("La tarjeta ya existe");
            }
            
            return true;
        }
    }
    public class CA2TarjetaColeccion : System.Collections.CollectionBase
    {
        public void Add(CA2Tarjeta pTarjeta)
        {
            if (pTarjeta == null)
                return;
            this.List.Add(pTarjeta);
        }
        public void AddUnico(CA2Tarjeta pTarjeta)
        {
            foreach (CA2Tarjeta _tarjeta in this)
                if (pTarjeta.Numero == _tarjeta.Numero)
                    return;
            this.List.Add(pTarjeta);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public void Remove(CA2Tarjeta pTarjeta)
        {
            for(int i = 0; i < this.Count; i++)
            {
                if (this[i].Numero == pTarjeta.Numero)
                {
                    Remove(i);
                    return;
                }

            }
        }
        public CA2Tarjeta this[int index]
        {
            get { return ((CA2Tarjeta)(this.List[index])); }
            set { this.List[index] = value; }
        }
        public CA2TarjetaColeccion ObtenerTodos(int pEstado)
        {
            return CA2Tarjeta.ObtenerPorEstado(pEstado);
        }
        /// <summary>
        /// Agrega primero en la lista al objeto enviado.
        /// </summary>
        /// <param name="pTarjeta"></param>
        /// <returns></returns>
       
        #region Para datasource
        public static CA2TarjetaColeccion ObtenerTarjetaPorNumero(int pNumero)
        {
            CA2TarjetaColeccion _resultado = null;
            CA2Tarjeta _tarjeta = CA2Tarjeta.CrearTarjeta(pNumero);
            if (_tarjeta != null)
            {
                _resultado = new CA2TarjetaColeccion();
                _resultado.Add(_tarjeta);
            }

            return _resultado;
        }        
        #endregion
    }
}
